package com.example.demo.common;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.UUID;

/**
 * Description:
 * User: 故我
 * Date: 2023-11-13
 * Time: 11:20
 */
public class PasswordUtils {
    /**
     * 普通密码生成一个加盐密码
     */
    public static String SaltPassword(String password) {
        // 1、产生一个盐值
        String salt = UUID.randomUUID().toString().replace("-", "");// 将 - 替换成空
        // 2、使用盐值 + 原密码 生成一个加盐密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 3、生成一个最终一个密码 [32位盐值 + $ + 加盐密码]
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 根据输入的密码 + 盐值 生成一个最终密码
     * 用来做最终密码的判断
     */
    public static String SaltPassword(String inputPassword, String salt) {
        // 使用 inputpassword + 盐值 生成一个密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes());
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 用于 inputPassword 和 finalPassword  继续比较
     */
    public static boolean CheckPassword(String inputPassword, String finalPassword) {
        // 对参数进行非空校验 和 最终密码的长度校验
        if (!StringUtils.hasLength(inputPassword) || !StringUtils.hasLength(finalPassword)
                || finalPassword.length() != 65) {
            return false;
        }
        // 获取到最终密码的盐值
        String salt = finalPassword.split("\\$")[0];
        // 根据盐值 和 inputPassword密码生成最终密码
        String finalPassword1 = PasswordUtils.SaltPassword(inputPassword, salt);
        return finalPassword.equals(finalPassword1);
    }

//    public static void main(String[] args) {
//        String password = "123123";
//        String finalPassword = PasswordUtils.SaltPassword(password);
//        System.out.println("第二次密码：" + PasswordUtils.SaltPassword(password));
//        System.out.println("第三次密码：" + PasswordUtils.SaltPassword(password));
//
//        String password1 = "123123";
//        System.out.println("是否正确：" + PasswordUtils.CheckPassword(password1,finalPassword));
//        String password2 = "123124";
//        System.out.println("是否正确：" + PasswordUtils.CheckPassword(password2,finalPassword));
//    }
}
